'use strict';

const Controller = require('egg').Controller;

/**
 * 项目组管理控制器
 * 处理项目组的增删改查等功能
 */
class ProjectGroupController extends Controller {
  /**
   * 获取项目组列表
   * 支持按名称筛选，返回未删除的项目组
   * @param {Object} ctx.request.body
   * @param {string} [ctx.request.body.project_group_name] - 项目组名称，模糊匹配
   */
  async list() {
    const { ctx } = this;
    // 验证参数
    ctx.validate({
      project_group_name: { type: 'string', required: false },
    }, ctx.request.body);

    const groups = await ctx.service.projectGroup.findAll(ctx.request.body);
    ctx.body = groups;
  }

  /**
   * 获取单个项目组详情
   * @param {Object} ctx.request.body
   * @param {number} ctx.request.body.project_group_id - 项目组ID
   * @throws {404} 项目组不存在时抛出异常
   */
  async getById() {
    const { ctx } = this;
    ctx.validate({
      project_group_id: { type: 'number', required: true },
    });

    const { project_group_id } = ctx.request.body;
    const group = await ctx.service.projectGroup.findById(project_group_id);
    if (!group) {
      ctx.throw(404, '未找到该项目组');
    }
    ctx.body = group;
  }

  /**
   * 创建新项目组
   * @param {Object} ctx.request.body
   * @param {string} ctx.request.body.project_group_name - 项目组名称
   * @param {string} [ctx.request.body.remark] - 备注
   * @throws {422} 项目组名称已存在时抛出异常
   */
  async create() {
    const { ctx } = this;
    ctx.validate({
      project_group_name: { type: 'string', required: true },
      remark: { type: 'string', required: false },
    });

    const result = await ctx.service.projectGroup.create(ctx.request.body);
    if (!result) {
      ctx.throw(422, '项目组名称已存在');
    }
    ctx.body = result;
  }

  /**
   * 更新项目组信息
   * @param {Object} ctx.request.body
   * @param {number} ctx.request.body.project_group_id - 项目组ID
   * @param {string} ctx.request.body.project_group_name - 项目组名称
   * @param {string} [ctx.request.body.remark] - 备注
   * @throws {404} 项目组不存在时抛出异常
   * @throws {422} 项目组名称已存在时抛出异常
   */
  async update() {
    const { ctx } = this;
    ctx.validate({
      project_group_id: { type: 'number', required: true },
      project_group_name: { type: 'string', required: true },
      remark: { type: 'string', required: false },
    });

    const result = await ctx.service.projectGroup.update(
      ctx.request.body.project_group_id,
      ctx.request.body
    );

    if (!result) {
      ctx.throw(404, '未找到该项目组');
    }
    if (result.error === 'duplicate_name') {
      ctx.throw(422, '项目组名称已存在');
    }

    ctx.body = result;
  }

  /**
   * 删除项目组
   * @param {Object} ctx.request.body
   * @param {number} ctx.request.body.project_group_id - 项目组ID
   * @throws {404} 项目组不存在时抛出异常
   * @throws {422} 项目组下有人员时抛出异常
   */
  async delete() {
    const { ctx } = this;
    ctx.validate({
      project_group_id: { type: 'number', required: true },
    });

    const result = await ctx.service.projectGroup.delete(ctx.request.body.project_group_id);
    if (!result) {
      ctx.throw(404, '未找到该项目组');
    }
    if (result.error === 'has_persons') {
      ctx.throw(422, '该项目组下存在人员，无法删除');
    }
    ctx.body = result;
  }
}

module.exports = ProjectGroupController; 